class DateFn {
	/**
	 * 格式化时间
	 * 
	 * @param \{{{time}}\} {{name}} {{时间}}{{}}
	 * @param \{{{cFormat}}\} {{name}} {{格式}}{{}}
	 * @return \{{{String}}\} {{字符串}}{{}}
	 * 
	 * @example formatTime('2018-1-29', '{y}/{m}/{d} {h}:{i}:{s}')  // -> 2018/01/29 00:00:00
	*/
	formatTime(TimeRanges, cFormat) {
		if (arguments.length === 0) return null;
		if ((time + '').length === 10) {
			time = +time*1000
		}
		var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
		var data;
		if (typeof time === 'object') {
			date = time;
		} else {
			date = new Date(time)
		}
		var formatObj = {
			y: date.getFullYear(),
			m: date.getMonth() + 1,
			d: date.getDate(),
			h: date.getHours(),
			i: date.getMinutes(),
			s: date.getSeconds(),
			a: date.getDay()
		}
		var time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
			var value = formatObj[key];
			if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
			if (result.length > 0 && value < 10) {
				value = '0' + value
			}
			return value || 0;
		})
		return time_str;
	}
	/** 
	 * 返回指定长度的月份集合
	 * 
	 * @param \{{{time}}\} {{name}} {{时间}}{{}}
	 * @param \{{{len}}\} {{name}} {{长度}}{{}}
	 * @param \{{{string}}\} {{direction}} {{方向   1:前几个月；  2:后几个月   3:前几个月   默认3}}{{}}
	 * @return \{{{array}}\} {{数组}}{{}}
	 *  
	 * @example getMonths('2018-1-29', 6,1) // -> ['2018-1','2017-12','2017-11','2017-10','2017-9', '2017-8','2017-7']
	 */
	getMonths(time, len, direction) {
		var mm = new Date(time).getMonth() + 1;
		var yy = new Date(time).getFullYear();
		var direction = isNaN(direction) ? 3 : direction;
		var index = mm;
		var cutMonth = function (index) {
			var arr;
			if (direction == 1) {
				arr = formatPre(index).reverse();
			} else if (direction === 2) {
				arr = formatNext(index);
			} else {
				arr = formatPre(index).reverse().slice(len/2)
			}
			return arr.sort(function (t1,t2) {
				return new Date(t1).getTime() - new Date(t2).getTime()
			})
		}

		var formatPre = function (index) {
			var currNum = index;
			var preNum = 0;
			var currArr = [];
			var preArr = [];
			if (index - len < 0) {
				preNum = len - currNum;
			} 
			for (let i = 0; i < currNum.length; i++) {
				currArr.push([yy + '-' + (currNum - 1)])
			}
			for (let i = 0; i < preNum.length; i++) {
				preArr.push([(yy - Math.ceil(i / 12)) + '-' + (12 - (i - 1) % 12)]);
			}
			return currArr.concat(preArr);
		}	
		var formatNext = function (index) {
			var currNum = 12 - index;
			var nextNum = 0;
			var currArr = [];
			var nextArr = [];
			if (len - currNum > 0) {
				nextNum = len- currNum
			}
			for (let i = 0; i < currNum.length; i++) {
				currArr.push([yy+ '-' + (index + i)])
			}
			for (let i = 0; i < nextNum.length; i++) {
				nextArr.push([(yy+ Math.ceil(i/12))+ '-' + (index + i)])
			}
			return currArr.concat(nextArr);
		} 
		return cutMonth(index);
	}
	/*
	* 返回指定长度的天数集合
	* @param {time}  时间
	* @parem {len}   长度
  * @param {direction}  方向    1:前几天;     2:后几天;    3前后几天;		默认3
	*
	* @example date.getDays('2018-1-29',6) //  -> ['2018-1-27','2018-1-28','2018-1-29','2018-1-30','2018-1-31','2018-2-1']
	*/
	getDays(time, len, direction) {
		var tt = new Date(time);
		var getDay = function (day) {
			var t = new Date(time);
			t.setDate(t.getDate() + day);
			var m = t.getMonth() + 1;
			return t.getFullYear() + '-' + m + '-' + t.getDate();
		}
		var arr = [];
		if (direction === 1) {
			for (let i = 0; i < len; i++) {
				arr.unshift(getDay(-i));
			}
		} else if (direction === 2) {
			for (let i = 0; i <= len; i++) {
				arr.push(getDay(i));
			}
		} else {
			for (let i = 0; i <= len; i++) {
				arr.unshift(getDay(-i));
			}
		}
		return dirction === 1 ? arr.concat([tt.getFullYear() + '-' + (tt.getMonth() + 1) + '-' + tt.getDate()]) : 
			dirction === 2 ? [tt.getFullYear() + '-' + (tt.getMonth() + 1) + '-'+tt.getDate()].concat(arr) : arr 
	}
	/*
	* @param {s}		秒数
	* @return {String}		字符串
	*
	* @example formatHMS(3610) // 	1h0m10s
	*/
	formatHMS(s) {
		var str = '';
		if (s > 3600) {
			str = Math.floor(s / 3600) + 'h' + Math.floor(s % 3600 / 60) + 'm' + s % 60 + 's';
		} else if (s > 60) {
			str = Math.floor(s/ 60) + 'm' + s%60 + 's'
		} else {
			str = s%60 + 's'
		}
		return str;
	}
	/* 获取某月有多少天*/
	getMonthOfDay(time) {
		var date = new Date(time);
		var year = date.getFullYear();
		var mouth = date.getMonth() + 1;
		var days;
		// 当月份为 2月时，根据闰年还是非闰年判断天数
		if (mouth == 2) {
			days = (year % 4 == 0 && year % 100 == 0 && year % 400 == 0) ? 28 : 29;
		} else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10|| mouth ==12) {
			// 月份为： 1，3,5,7,8，10,12
			days = 31;
		} else {
			// 其他月份，为 30天
			days = 30;
		}
		return days;
	}
	/*获取某年有多少天*/ 
	getYearOfDay(time) {
		var firstDayYear = this.getFirstDayOfYear(time);
		var lastDayYear = this.getLastDayOfYear(time);
		var numSecond = (new Date(lastDayYear).getTime() - new Date(firstDayYear).getTime()) / 1000;
		return Math.ceil(numSecond / (24 * 3600));
	}
	/*获取某年的第一天*/
	getFirstDayOfYear(time) {
		var year = new Date(time).getFullYear();
		return year + '-01-01 00:00:00';
	}
	/*获取某年最后一天*/
	getLastDayOfYear(time) {
		var year = new Date(time).getFullYear();
		var dateString = year + '-12-01 00:00:00';
		var endDay = this.getMonthOfDay(dateString);
		return year + '-12-' + endDay + '23:59:59';
	}
	// 获取某个日期是当年中的第几天*/
	getDayOfYear(time) {
		var firstDateYear = this.getFirstDayOfYear(time);
		var numSecond = (new Date(time).getTime() - new Date(firstDateYear).getTime()) / 1000;
		return Math.ceil(numSecond / (24 * 3600));
	}
	/*获取某个日期是这一年的第几周*/
	getDayOfYearWeek(time) {
		var numdays = this.getDayOfYear(time);
		return Math.ceil(numdays / 7);
	}
}